GError *error = NULL;
GOptionContext *context;
GMainLoop *loop;
+ GInetAddress *inet;
GSocketAddress *address;
GSocketService *listener;
- char *path, *base;
+ char *path, *basename;
char *http_address = NULL;
int http_port = 0;
- int display = 1;
+ char *display;
+ int port = 0;
const GOptionEntry entries[] = {
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
{ "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" },
exit (1);
}
+ display = NULL;
if (argc > 1)
{
if (*argv[1] != ':')
g_printerr ("Usage broadwayd [:DISPLAY]\n");
exit (1);
}
- display = strtol(argv[1]+1, NULL, 10);
- if (display == 0)
- {
- g_printerr ("Failed to parse display num %s\n", argv[1]);
- exit (1);
- }
+ display = argv[1];
+ }
+
+ if (display == NULL)
+ {
+#ifdef G_OS_UNIX
+ display = ":0";
+#else
+ display = ":tcp"
+#endif
+ }
+
+ if (g_str_has_prefix (display, ":tcp"))
+ {
+ port = strtol (display + strlen (":tcp"), NULL, 10);
+
+ inet = g_inet_address_new_from_string ("127.0.0.1");
+ g_print ("Listening on 127.0.0.1:%d\n", port + 9090);
+ address = g_inet_socket_address_new (inet, port + 9090);
+ g_object_unref (inet);
+ }
+#ifdef G_OS_UNIX
+ else if (display[0] == ':' && g_ascii_isdigit(display[1]))
+ {
+ port = strtol (display + strlen (":"), NULL, 10);
+ basename = g_strdup_printf ("broadway%d.socket", port + 1);
+ path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
+ g_free (basename);
+
+ g_print ("Listening on %s\n", path);
+ address = g_unix_socket_address_new_with_type (path, -1,
+ G_UNIX_SOCKET_ADDRESS_ABSTRACT);
+ g_free (path);
+ }
+#endif
+ else
+ {
+ g_printerr ("Failed to parse display %s\n", display);
+ exit (1);
}
if (http_port == 0)
- http_port = 8080 + (display - 1);
+ http_port = 8080 + port;
server = broadway_server_new (http_address, http_port, &error);
if (server == NULL)
return 1;
}
- base = g_strdup_printf ("broadway%d.socket", display);
- path = g_build_filename (g_get_user_runtime_dir (), base, NULL);
- g_free (base);
- g_print ("Listening on %s\n", path);
- address = g_unix_socket_address_new_with_type (path, -1,
- G_UNIX_SOCKET_ADDRESS_ABSTRACT);
- g_free (path);
-
listener = g_socket_service_new ();
if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
address,
return 1;
}
g_object_unref (address);
-
g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL);
g_socket_service_start (G_SOCKET_SERVICE (listener));
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
+#include "gdkintl.h"
typedef struct BroadwayInput BroadwayInput;
}
GdkBroadwayServer *
-_gdk_broadway_server_new (int port, GError **error)
+_gdk_broadway_server_new (const char *display, GError **error)
{
GdkBroadwayServer *server;
char *basename;
GSocketClient *client;
GSocketConnection *connection;
+ GInetAddress *inet;
GSocketAddress *address;
GPollableInputStream *pollable;
GInputStream *in;
GSource *source;
char *path;
+ char *local_socket_type = NULL;
+ int port;
- basename = g_strdup_printf ("broadway%d.socket", port);
- path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
- g_free (basename);
+ if (display == NULL)
+ {
+#ifdef G_OS_UNIX
+ display = ":0";
+#else
+ display = ":tcp"
+#endif
+ }
- address = g_unix_socket_address_new_with_type (path, -1,
- G_UNIX_SOCKET_ADDRESS_ABSTRACT);
- g_free (path);
+ if (g_str_has_prefix (display, ":tcp"))
+ {
+ port = 9090 + strtol (display + strlen (":tcp"), NULL, 10);
+
+ inet = g_inet_address_new_from_string ("127.0.0.1");
+ address = g_inet_socket_address_new (inet, port);
+ g_object_unref (inet);
+ }
+#ifdef G_OS_UNIX
+ else if (display[0] == ':' && g_ascii_isdigit(display[1]))
+ {
+ port = strtol (display + strlen (":"), NULL, 10);
+ basename = g_strdup_printf ("broadway%d.socket", port + 1);
+ path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
+ g_free (basename);
+
+ address = g_unix_socket_address_new_with_type (path, -1,
+ G_UNIX_SOCKET_ADDRESS_ABSTRACT);
+ g_free (path);
+ }
+#endif
+ else
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
+ _("broadway display type not supported '%s'"), display);
+ return NULL;
+ }
+
+ g_free (local_socket_type);
client = g_socket_client_new ();
- error = NULL;
connection = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (address), NULL, error);
-
+
g_object_unref (address);
g_object_unref (client);
#define GDK_IS_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_SERVER))
#define GDK_BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass))
-GdkBroadwayServer *_gdk_broadway_server_new (int port,
+GdkBroadwayServer *_gdk_broadway_server_new (const char *display,
GError **error);
void _gdk_broadway_server_flush (GdkBroadwayServer *server);
void _gdk_broadway_server_sync (GdkBroadwayServer *server);
{
GdkDisplay *display;
GdkBroadwayDisplay *broadway_display;
- int port;
display = g_object_new (GDK_TYPE_BROADWAY_DISPLAY, NULL);
broadway_display = GDK_BROADWAY_DISPLAY (display);
if (display_name == NULL)
display_name = g_getenv ("BROADWAY_DISPLAY");
- port = 0;
- if (display_name != NULL)
- {
- if (*display_name == ':')
- display_name++;
- port = strtol(display_name, NULL, 10);
- }
- if (port == 0)
- port = 1;
-
- broadway_display->server = _gdk_broadway_server_new (port, NULL);
+ broadway_display->server = _gdk_broadway_server_new (display_name, NULL);
if (broadway_display->server == NULL)
{
g_printerr ("Unable to init server\n");